﻿using Sorting.App.Models.Enum;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Modules.ActionRun
{
    public class SmallScreanHelper
    {
        private readonly static SerialPort serialPort = new SerialPort();
        //SerialPort serialPort = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One); // 根据实际COM口和设置调整
        //serialPort.RtsEnable = true;

        /// <summary>
        /// 开启小屏串口
        /// </summary>
        /// <returns></returns>
        public static bool OpenScanSerialPort()
        {
            try
            {
                var res = false;

                serialPort.PortName = "COM5";
                serialPort.BaudRate = 115200;
                serialPort.DataBits = 8;
                serialPort.StopBits = StopBits.One;
                serialPort.Parity = Parity.None;
                serialPort.RtsEnable = true;
                //serialPort.ReadTimeout = 500;
                //serialPort.WriteTimeout = 500;
                serialPort.Open();
                res = true;

                return res;
            }
            catch (Exception ex)
            {
                throw;
            }
        }

        /// <summary>
        /// 写科室
        /// </summary>
        /// <param name="addr"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public static bool WriteWreaName(string addr, string data)
        {

            try
            {
                if (!serialPort.IsOpen)
                {
                    //OpenScanSerialPort();
                }

                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

                //1、拼接报文
                List<byte> SendCommand = new List<byte>();

                SendCommand.AddRange(new byte[] { 0x4C });//包头

                //byte[] bAddr = Encoding.ASCII.GetBytes(addr);

                int iAddr = int.Parse(addr);

                // 将整数转换为 byte 数组
                byte[] bAddr = new byte[] { 0x00, (byte)iAddr };
                SendCommand.AddRange(bAddr);//地址位

                SendCommand.AddRange(new byte[] { 0xFF, 0x01 });//功能码

                byte[] bData = Encoding.GetEncoding("GBK").GetBytes(data);
                SendCommand.AddRange(bData);//数据位

                SendCommand.AddRange(new byte[] { 0x4D });//包尾

                // 将 List<byte> 转换为 byte[]
                byte[] sendData = SendCommand.ToArray();
                //byte[] sendData = new byte[] { 0x4c, 0x00, 0x6f, 0xFF, 0x01, 0x4D };

                serialPort.Write(sendData, 0, sendData.Length);
                Thread.Sleep(200);
                return true;
            }
            catch (Exception)
            {

                throw;
            }
        }

        /// <summary>
        /// 写位置
        /// </summary>
        /// <param name="addr"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public static bool WritePosName(string addr, string data)
        {

            try
            {
                if (!serialPort.IsOpen)
                {
                    //OpenScanSerialPort();
                }

                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

                //1、拼接报文
                List<byte> SendCommand = new List<byte>();

                SendCommand.AddRange(new byte[] { 0x4C });//包头

                //byte[] bAddr = Encoding.ASCII.GetBytes(addr);

                int iAddr = int.Parse(addr);

                // 将整数转换为 byte 数组
                byte[] bAddr = new byte[] { 0x00, (byte)iAddr };
                SendCommand.AddRange(bAddr);//地址位

                SendCommand.AddRange(new byte[] { 0xFF, 0x02 });//功能码

                byte[] bData = Encoding.GetEncoding("GBK").GetBytes(data);
                SendCommand.AddRange(bData);//数据位

                SendCommand.AddRange(new byte[] { 0x4D });//包尾

                // 将 List<byte> 转换为 byte[]
                byte[] sendData = SendCommand.ToArray();
                serialPort.Write(sendData, 0, sendData.Length);
                return true;
            }
            catch (Exception)
            {

                throw;
            }
        }

        public static bool WriteMaxNum(string addr, int? data)
        {

            try
            {
                if (!serialPort.IsOpen)
                {
                    //OpenScanSerialPort();
                }

                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

                //1、拼接报文
                List<byte> SendCommand = new List<byte>();

                SendCommand.AddRange(new byte[] { 0x4C });//包头

                //byte[] bAddr = Encoding.ASCII.GetBytes(addr);

                int iAddr = int.Parse(addr);

                // 将整数转换为 byte 数组
                byte[] bAddr = new byte[] { 0x00, (byte)iAddr };
                SendCommand.AddRange(bAddr);//地址位

                SendCommand.AddRange(new byte[] { 0xFF, 0x03 });//功能码

                //int iData = int.Parse(data);

                // 将整数转换为 byte 数组
                byte[] bData = new byte[] { 0x00, (byte)data };
                SendCommand.AddRange(bData);//地址位

                SendCommand.AddRange(new byte[] { 0x4D });//包尾

                // 将 List<byte> 转换为 byte[]
                byte[] sendData = SendCommand.ToArray();
                serialPort.Write(sendData, 0, sendData.Length);
                return true;
            }
            catch (Exception)
            {

                throw;
            }
        }


        public static bool WriteCurNum(string addr, int? data)
        {

            try
            {
                if (!serialPort.IsOpen)
                {
                    //OpenScanSerialPort();
                }

                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

                //1、拼接报文
                List<byte> SendCommand = new List<byte>();

                SendCommand.AddRange(new byte[] { 0x4C });//包头

                //byte[] bAddr = Encoding.ASCII.GetBytes(addr);

                int iAddr = int.Parse(addr);

                // 将整数转换为 byte 数组
                byte[] bAddr = new byte[] { 0x00, (byte)iAddr };
                SendCommand.AddRange(bAddr);//地址位

                SendCommand.AddRange(new byte[] { 0xFF, 0x04 });//功能码

                //int iData = int.Parse(data);

                // 将整数转换为 byte 数组
                byte[] bData = new byte[] { 0x00, (byte)data };
                SendCommand.AddRange(bData);//地址位

                SendCommand.AddRange(new byte[] { 0x4D });//包尾

                // 将 List<byte> 转换为 byte[]
                byte[] sendData = SendCommand.ToArray();
                serialPort.Write(sendData, 0, sendData.Length);
                return true;
            }
            catch (Exception)
            {

                throw;
            }
        }


        /// <summary>
        /// 桶满状态
        /// </summary>
        /// <param name="addr"></param>
        /// <param name="data"></param>
        /// <param name="state">0:清空状态 1：将要进水 2：桶满状态</param>
        /// <returns></returns>
        public static bool WriteFullState(string addr)
        {

            try
            {
                if (!serialPort.IsOpen)
                {
                    //OpenScanSerialPort();
                }

                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

                //1、拼接报文
                List<byte> SendCommand = new List<byte>();

                SendCommand.AddRange(new byte[] { 0x4C });//包头

                //byte[] bAddr = Encoding.ASCII.GetBytes(addr);

                int iAddr = int.Parse(addr);

                // 将整数转换为 byte 数组
                byte[] bAddr = new byte[] { 0x00, (byte)iAddr };
                SendCommand.AddRange(bAddr);//地址位

                SendCommand.AddRange(new byte[] { 0xFF, 0x05 });//功能码


                //桶满状态
                byte[] bData = new byte[] { 0x00, 0x02 };
                SendCommand.AddRange(bData);//地址位



                SendCommand.AddRange(new byte[] { 0x4D });//包尾

                // 将 List<byte> 转换为 byte[]
                byte[] sendData = SendCommand.ToArray();
                serialPort.Write(sendData, 0, sendData.Length);
                return true;
            }
            catch (Exception)
            {

                throw;
            }
        }


        public static bool WriteWaitState(string addr)
        {

            try
            {
                if (!serialPort.IsOpen)
                {
                    OpenScanSerialPort();
                }

                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

                //1、拼接报文
                List<byte> SendCommand = new List<byte>();

                SendCommand.AddRange(new byte[] { 0x4C });//包头

                //byte[] bAddr = Encoding.ASCII.GetBytes(addr);

                int iAddr = int.Parse(addr);

                // 将整数转换为 byte 数组
                byte[] bAddr = new byte[] { 0x00, (byte)iAddr };
                SendCommand.AddRange(bAddr);//地址位

                SendCommand.AddRange(new byte[] { 0xFF, 0x05 });//功能码

                //将要进水 黄色外框
                byte[] bData = new byte[] { 0x00, 0x01 };
                SendCommand.AddRange(bData);//地址位



                SendCommand.AddRange(new byte[] { 0x4D });//包尾

                // 将 List<byte> 转换为 byte[]
                byte[] sendData = SendCommand.ToArray();
                serialPort.Write(sendData, 0, sendData.Length);
                return true;
            }
            catch (Exception)
            {

                throw;
            }
        }

        /// <summary>
        /// 清空状态
        /// </summary>
        /// <param name="addr"></param>
        /// <returns></returns>
        public static bool WriteClearState(string addr)
        {

            try
            {
                if (!serialPort.IsOpen)
                {
                    OpenScanSerialPort();
                }

                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

                //1、拼接报文
                List<byte> SendCommand = new List<byte>();

                SendCommand.AddRange(new byte[] { 0x4C });//包头

                //byte[] bAddr = Encoding.ASCII.GetBytes(addr);

                int iAddr = int.Parse(addr);

                // 将整数转换为 byte 数组
                byte[] bAddr = new byte[] { 0x00, (byte)iAddr };
                SendCommand.AddRange(bAddr);//地址位

                SendCommand.AddRange(new byte[] { 0xFF, 0x05 });//功能码

                //清空状态

                byte[] bData = new byte[] { 0x00, 0x00 };
                SendCommand.AddRange(bData);//地址位


                SendCommand.AddRange(new byte[] { 0x4D });//包尾

                // 将 List<byte> 转换为 byte[]
                byte[] sendData = SendCommand.ToArray();
                serialPort.Write(sendData, 0, sendData.Length);
                return true;
            }
            catch (Exception)
            {

                throw;
            }
        }
    }
}
